/*
 * Copyright (C) 2014 gujicheng
 * 未经作者许可，禁止将该程序用于商业用途
 * 
 * 该声波通信程序在前一个开源版本（SinVoice）的基础上，做了许多优化：
 * 优化如下：
 * 1. 识别效率更高，几乎达到100%，完全可以达到商业用途标准，比chirp，支付宝，茄子快传等软件的识别效率更高。
 * 2. 能支持更多复杂场景的识别，在有嘈杂大声的背景音乐，嘈杂的会议室，食堂，公交车，马路，施工场地，
 *     小汽车，KTV等一些复杂的环境下，依然能保持很高的识别率。
 * 3. 能支持更多token的识别，通过编码可以传送所有字符。
 * 4. 通过定制可以实现相同字符的连续传递,比如“234456”。
 * 5. 支持自动纠错功能，在有3个以内字符解码出错的情况下可以自动纠正。
 * 6. 程序运行效率非常高，可以用于智能手机，功能手机，嵌入式设备，PC，平板等嵌入式系统上。
 * 7. 声波的频率声音和音量可定制。
 * 
 * 此demo程序属于试用性质程序，仅具备部分功能，其限制如下：
 * 1. 仅支持部分字符识别。
 * 2. 识别若干次后，程序会自动停止识别。若想继续使用，请停止该程序，然后重新启动程序。
 * 3. 不支持连续字符传递。
 * 4. 不支持自动纠错功能。
 * 5. 禁止用于商业用途。
 * 
 * 若您对完整的声波通信程序感兴趣，请联系作者获取商业授权版本（仅收取苦逼的加班费）。
 *************************************************************************
 **                   作者信息                                                            **
 *************************************************************************
 ** Email: gujicheng197@126.com                                        **
 ** QQ   : 29600731                                                                 **
 ** Weibo: http://weibo.com/gujicheng197                          **
 *************************************************************************
 */
package com.libra.sinvoice;

public class BufferQueue {
    private final static String TAG = "BufferQueue";

    private Queue mEmptyQueue;
    private Queue mFullQueue;
    private BufferData[] mBufferData;

    public BufferQueue(int bufferCount, int bufferSize) {
        if (bufferCount > 0 && bufferSize > 0) {
            mBufferData = new BufferData[bufferCount];
            for (int i = 0; i < bufferCount; ++i) {
                mBufferData[i] = new BufferData(bufferSize);
            }

            mEmptyQueue = new Queue(bufferCount);
            mFullQueue = new Queue(bufferCount);
        } else {
            LogHelper.e(TAG, "BufferQueue param error, bufferCount:" + bufferCount + "  bufferSize:" + bufferSize);
        }
    }

    public synchronized void set() {
        if (null != mEmptyQueue && null != mFullQueue) {
            mEmptyQueue.set(mBufferData);
            mFullQueue.set(null);

            for ( int i = 0; i < mBufferData.length; ++i ) {
                mBufferData[i].reset();
            }
        } else {
            LogHelper.e(TAG, "set queue is null");
        }
    }

    public synchronized void reset() {
        if (null != mEmptyQueue && null != mFullQueue) {
            LogHelper.d(TAG, "reset start");
            mEmptyQueue.reset();
            mFullQueue.reset();

            LogHelper.d(TAG, "reset end");
        } else {
            LogHelper.e(TAG, "reset queue is null");
        }
    }

    public BufferData getEmpty() {
        if (null != mEmptyQueue && null != mFullQueue) {
            return mEmptyQueue.getBuffer();
        } else {
            LogHelper.e(TAG, "getEmpty queue is null");
        }
        return null;
    }

    public boolean putEmpty(BufferData data) {
        if (null != mEmptyQueue && null != mFullQueue) {
            return mEmptyQueue.putBuffer(data);
        } else {
            LogHelper.e(TAG, "putEmpty queue is null");
        }
        return false;
    }

    public BufferData getFull() {
        if (null != mEmptyQueue && null != mFullQueue) {
            return mFullQueue.getBuffer();
        } else {
            LogHelper.e(TAG, "getFull queue is null");
        }
        return null;
    }

    public boolean putFull(BufferData data) {
        if (null != mEmptyQueue && null != mFullQueue) {
            return mFullQueue.putBuffer(data);
        } else {
            LogHelper.e(TAG, "putFull queue is null");
        }
        return false;
    }
}
